package main

type TextEditor struct {
	// 两个栈都是栈顶在最大下标，所以 right 中的数据是倒着的
	left  []byte
	right []byte
}

func Constructor() TextEditor {
	return TextEditor{
		left:  []byte{},
		right: []byte{},
	}
}

func (this *TextEditor) AddText(text string) {
	this.left = append(this.left, []byte(text)...)
}

func (this *TextEditor) DeleteText(k int) int {
	if k > len(this.left) {
		k = len(this.left)
	}
	this.left = this.left[:len(this.left)-k]
	return k
}

// 12345
// left:123
// right:54
func (this *TextEditor) CursorLeft(k int) string {
	if k > len(this.left) {
		k = len(this.left)
	}
	tmp := this.left[len(this.left)-k:]
	this.left = this.left[:len(this.left)-k]
	for i := len(tmp) - 1; i >= 0; i-- {
		this.right = append(this.right, tmp[i])
	}
	// return result
	l := 10
	if l > len(this.left) {
		l = len(this.left)
	}
	return string(this.left[len(this.left)-l:])
}

func (this *TextEditor) CursorRight(k int) string {
	if k > len(this.right) {
		k = len(this.right)
	}
	tmp := this.right[len(this.right)-k:]
	this.right = this.right[:len(this.right)-k]
	for i := len(tmp) - 1; i >= 0; i-- {
		this.left = append(this.left, tmp[i])
	}
	// return result
	l := 10
	if l > len(this.left) {
		l = len(this.left)
	}
	return string(this.left[len(this.left)-l:])
}

func main() {
	textEditor := Constructor()
	textEditor.AddText("leetcode") // 当前文本为 "leetcode|" 。
	textEditor.DeleteText(4)       // 返回 4
	// 当前文本为 "leet|" 。
	// 删除了 4 个字符。
	textEditor.AddText("practice") // 当前文本为 "leetpractice|" 。
	textEditor.CursorRight(3)      // 返回 "etpractice"
	// 当前文本为 "leetpractice|".
	// 光标无法移动到文本以外，所以无法移动。
	// "etpractice" 是光标左边的 10 个字符。
	textEditor.CursorLeft(8) // 返回 "leet"
	// 当前文本为 "leet|practice" 。
	// "leet" 是光标左边的 min(10, 4) = 4 个字符。
	textEditor.DeleteText(10) // 返回 4
	// 当前文本为 "|practice" 。
	// 只有 4 个字符被删除了。
	textEditor.CursorLeft(2) // 返回 ""
	// 当前文本为 "|practice" 。
	// 光标无法移动到文本以外，所以无法移动。
	// "" 是光标左边的 min(10, 0) = 0 个字符。
	textEditor.CursorRight(6) // 返回 "practi"
	// 当前文本为 "practi|ce" 。
	// "practi" 是光标左边的 min(10, 6) = 6 个字符。
}
